// eslint-disable-next-line @typescript-eslint/triple-slash-reference
/// <reference  path="../../support/index.d.ts" />
import '../../support/commands'
import { TBEAllProductsResponse } from '../../../src/api/productsApiSlice'

// Авторизация или регистрация с валидацией (как на уроке: проверить на правильность ввода в поля).
//   + После авторизации сделать логаут.
//   + После снова авторизоваться и создать пост (вместо создания поста добавил в избранное).
//   + Найти пост на странице (найти продукт в избранном и перейти в карточку продукта).
//   + Поставить лайк этому посту (добавить отзыв продукту).
//   + Проверить наличие лайка (проверил наличия отзыва).

describe('Тестируем регистрацию нового пользователя и его дальнейшую аутентификацию', () => {
	beforeEach(() => {
		cy.viewport(1480, 920)
		cy.visit('/signin')
	})

	it('Проверяем, что есть заголовок Аутентификация на странице', () => {
		cy.get('p').contains('Аутентификация')
	})

	it('Проверяем на наличие обязательных элементов', () => {
		// Элементы есть в наличии
		cy.get('form div:first-child label').contains('Email Address')
		cy.get('form div:nth-child(2) label').contains('Password')
		cy.get('form button[type="submit"]').contains('Войти')
		cy.get('form button[type="button"]').contains('Регистрация')

		// Элементы-инпусты пусты
		cy.get('form div:first-child').should('have.value', '')
		cy.get('form div:nth-child(2)').should('have.value', '')
	})

	it('Проверяем валидацию', () => {
		cy.get('form div:first-child p').should('not.exist')
		cy.get('form div:nth-child(2) p').should('not.exist')
		cy.get('form button[type="submit"]').click()
		cy.get('form div:first-child p').contains('email is a required field')
		cy.get('form div:nth-child(2) p').contains(
			'password must be at least 6 characters'
		)
	})

	it('Проверяем возможность после аутентификации выйти из системы', () => {
		cy.login()
		cy.get('[data-testid="PROFILE_BUTTON_TEST_ID"]').click()
		cy.url().should('be.equal', 'http://localhost:3000/profile')
		cy.get('[data-testid="LOGOUT_BUTTON_TEST_ID"]').click()
		cy.url().should('be.equal', 'http://localhost:3000/signin')
	})

	it('Проверка добавление продукта в Избранное и публикация отзыва', () => {
		cy.intercept('https://api.react-learning.ru/products/?page=1&limit=20').as(
			'products'
		)

		cy.login().then((_id) => {
			cy.url().should('be.equal', 'http://localhost:3000/')
			cy.get('div > a:nth-child(2)').contains('Каталог').click()
			cy.url().should('be.equal', 'http://localhost:3000/catalog')

			// находим первый первый нелайкнутый продукт
			cy.wait('@products').then((interception) => {
				const unlikedProductId = (
					interception.response?.body as TBEAllProductsResponse
				).products.find((catalog) => !catalog.likes.includes(_id))?._id
				cy.get(`[data-testid="LINK_${unlikedProductId}"]`).click()
				cy.url().should(
					'be.equal',
					`http://localhost:3000/product/${unlikedProductId}`
				)

				// Добавляет в избранное
				cy.get(
					`[data-testid="TO_FAVORITES_BUTTON_${unlikedProductId}"]`
				).click()
				// Переходим в Избранное
				cy.get('[data-testid="FAVORITES_BUTTON_TEST_ID"]').wait(2000).click()
				// Далее переходим в карточку товара
				cy.get(`[data-testid="LINK_${unlikedProductId}"]`).click()
				// Удаляю из избранного
				cy.get(`[data-testid="TO_FAVORITES_BUTTON_${unlikedProductId}"]`)
					.wait(3000)
					.click()

				// Следим за созданием запроса на публикацию отзыва
				cy.intercept(
					`https://api.react-learning.ru/products/review/${unlikedProductId}`
				).as('review')
				// Нажали Написать отзыв
				cy.get('[data-testid="ADD_REVIEW_BUTTON"]').wait(3000).click()
				// Ввели текст отзыва
				cy.get('[data-testid="REVIEW_INPUT_TEXTFIELD"]').type(
					'Отзыв от Cypress!'
				)
				// Добавили оценку
				cy.get('[data-testid="REVIEW_RATING"] > label:nth-child(7)').click()
				// Опубликовать отзыв
				cy.get('[data-testid="PUBLISH_REVIEW_BUTTON"]').click()
				// Проверяем отправку отзыва
				cy.wait('@review').its('response.statusCode').should('eq', 200)
			})
		})
	})
})
